#include "TcpServer.hpp"
#include "Command.hpp"
// #include"Dict.hpp"
std::string defaultHandler(const std::string &word, InetAddr &addr)
{
    LOG(LogLevel::INFO) << "defaultHandler,word:" << word;
    std::string s = "haha";
    s += word;
    return s;
}
// ./tcpserver port
void Usage(std::string proc)
{
    std::cout << "Usage: " << proc << " port" << std::endl;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        // 告诉用户应该怎么去用
        Usage(argv[0]);
        exit(USAGE_ERR); // 错误码退出
    }
    uint16_t port = std::stoi(argv[1]); // 获取端口号

    Enable_Console_Log_Strategy(); // 显示器策略

    // 1、翻译模块
    //  Dict d;//创建一个翻译对象
    //  d.LoadDict();//将字典加载进来

    // 远程执行的命令模块
    Command cmd;
    //函数叫做Excute，参数叫做cmd ，剩下两个参数是预留的
    //std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(port,std::bind(&Command::Excute,cmd,std::placeholders::_1,std::placeholders::_2));    
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(port,[&cmd](const std::string&command,InetAddr&addr){
        return cmd.Excute(command,addr);//将命令结果进行返回操作
    });  
    
    //上面两种写法都是一样的
    
    // 将外部对象带进来&d
    //  std::unique_ptr<TcpServer>tsvr=std::make_unique<TcpServer>(port,[&d](const std::string&word,InetAddr&addr){
    //      return d.Translate(word,addr);//将翻译结果进行返回操作
    //  });//创建一个TcpServer对象
    // 当网络中收到了对应的请求的对应的字符串，他会回调我们的匿名函数，绑定到翻译对象上，将参数一传，然后进行翻译操作
    tsvr->Init(); // 初始化
    tsvr->Run();  // 运行
    return 0;
}